﻿using System;
using System.Collections.Generic;
using System.Text;

namespace HZY.DbExtensions
{
    using HzySql;
    using HzySql.Core.SqlServer;
    using HzySql.Interface;
    using HzySql.Models;
    using Microsoft.Extensions.DependencyInjection;
    using System.Linq;
    using Toolkit;

    public static class HzySqlContextExtensions
    {
        /// <summary>
        /// 模型注册
        /// </summary>
        private static void ModelRegister()
        {
            #region 框架模型
            ModelSet.GetOrCacheFieldInfo<HZY.Models.Sys.Sys_AppLog>();
            ModelSet.GetOrCacheFieldInfo<HZY.Models.Sys.Sys_Function>();
            ModelSet.GetOrCacheFieldInfo<HZY.Models.Sys.Sys_Menu>();
            ModelSet.GetOrCacheFieldInfo<HZY.Models.Sys.Sys_MenuFunction>();
            ModelSet.GetOrCacheFieldInfo<HZY.Models.Sys.Sys_Role>();
            ModelSet.GetOrCacheFieldInfo<HZY.Models.Sys.Sys_RoleMenuFunction>();
            ModelSet.GetOrCacheFieldInfo<HZY.Models.Sys.Sys_User>();
            ModelSet.GetOrCacheFieldInfo<HZY.Models.Sys.Sys_UserRole>();
            #endregion
            //base
            ModelSet.GetOrCacheFieldInfo<HZY.Models.Member>();
        }

        /// <summary>
        /// 使用 HzySql 及模型注册
        /// 本注册 采用 row number 模式分页 适用于 mssql 08 数据库
        /// </summary>
        /// <param name="services"></param>
        /// <param name="connectString"></param>
        /// <returns></returns>
        public static IServiceCollection UseHzySqlRowNumber(this IServiceCollection services, string connectString)
        {
            var iHzySql = new HzySqlDbContext(connectString, PagingMode.ROW_NUMBER);

            #region 使用 拦截器
            //拦截缓存表信息
            iHzySql.UseAopCacheFieldInfoCall((propertyinfo, fieldInfo, type) =>
            {
                fieldInfo.Remarks = HZY.Toolkit.ReadXmlSummary.XMLForMember(propertyinfo)?.InnerText?.Trim()?.Split('=', '>')?[0];
            });
            //拦截语句
            iHzySql.UseAopExecuteSqlBeforeCall((iSqlCodeContext, sqlCode) =>
            {
                Tools.Log.Write($"语句>>{sqlCode}");
            });
            //异常拦截
            iHzySql.UseAopExceptionCall(ex =>
            {
                Tools.Log.Write($"异常>>{ex.Message}");
            });
            #endregion

            //开启返回空实例
            HzySqlExtend.ReturnInstance = true;

            ModelRegister();
            return services.AddScoped(w => iHzySql);
        }

        /// <summary>
        /// 使用 HzySql 及模型注册
        /// </summary>
        /// <param name="services"></param>
        /// <param name="connectString"></param>
        /// <returns></returns>
        public static IServiceCollection UseHzySql(this IServiceCollection services, string connectString)
        {
            var iHzySql = new HzySqlDbContext(connectString);

            #region 使用 拦截器 拦截缓存表信息
            //拦截缓存表信息
            iHzySql.UseAopCacheFieldInfoCall((propertyinfo, fieldInfo, type) =>
            {
                fieldInfo.Remarks = HZY.Toolkit.ReadXmlSummary.XMLForMember(propertyinfo)?.InnerText?.Trim()?.Split('=', '>')?[0];
            });
            //拦截语句
            iHzySql.UseAopExecuteSqlBeforeCall((iSqlCodeContext, sqlCode) =>
            {
                Tools.Log.Write($"语句>>{sqlCode}");
            });
            //异常拦截
            iHzySql.UseAopExceptionCall(ex =>
            {
                Tools.Log.Write($"异常>>{ex.Message}");
            });
            #endregion

            //开启返回空实例
            HzySqlExtend.ReturnInstance = true;

            ModelRegister();

            #region HzySqlContext 注入

            //在同一个Scope内只初始化一个实例 ，可以理解为（ 每一个request级别只创建一个实例，同一个http request会在一个 scope内）
            //services.AddScoped(w => hzySqlDbContext);

            //每一次GetService都会创建一个新的实例
            //services.AddTransient(w => hzySqlDbContext);

            //单利模式，整个应用程序生命周期以内只创建一个实例
            services.AddSingleton(w => iHzySql);
            #endregion

            return services;
        }






    }
}
